{%glBindBuffer}(GL_ARRAY_BUFFER, vertex_buffer); // vertex_buffer is retrieved from {%glGenBuffers}
{%glBindBuffer}(GL_ELEMENT_ARRAY_BUFFER, index_buffer); // index_buffer is retrieved from {%glGenBuffers}

{%glEnableVertexAttribArray}(texcoord_attrib_index); // Attribute indexes were received from calls to {%glGetAttribLocation}, or passed into {%glBindAttribLocation}.
{%glEnableVertexAttribArray}(normal_attrib_index);
{%glEnableVertexAttribArray}(position_attrib_index);

// vertex_stride is the size of bytes of each vertex in the buffer object
// vertex_position_offset and kin are the offset in bytes of the position data
// in each vertex. For example if your vertex structure is
// [ position, texcoord, normal ] then position vertex_position_offset will
// have offset 0, vertex_texcoord_offset is 12 (position is 3 * sizeof(float)
// bytes large, and texcoord comes just after) and vertex_normal_offset is
// 20 = 5 * sizeof(float).
GLintptr vertex_texcoord_offset = 3 * sizeof(float);
GLintptr vertex_normal_offset = 5 * sizeof(float);
GLintptr vertex_position_offset = 0 * sizeof(float);

{%glVertexAttribPointer}(texcoord_attrib_index, 2, GL_FLOAT, false, vertex_stride, (GLvoid*)vertex_texcoord_offset);
{%glVertexAttribPointer}(normal_attrib_index, 3, GL_FLOAT, false, vertex_stride, (GLvoid*)vertex_normal_offset);
{%glVertexAttribPointer}(position_attrib_index, 3, GL_FLOAT, false, vertex_stride, (GLvoid*)vertex_position_offset);

// num_vertices is the number of verts in your vertex_data.
// index_data is an array of unsigned int offsets into vertex_data.
{%glDrawElements}(GL_TRIANGLES, num_vertices, GL_UNSIGNED_INT, NULL);

{%glDisableVertexAttribArray}(position_attrib_index);
{%glDisableVertexAttribArray}(texcoord_attrib_index);
{%glDisableVertexAttribArray}(normal_attrib_index);
